HTTP 速览
HTTP 的标准是由 IETF 组织制定,跟它相关的标准:
HTTP Documentation (httpwg.org)
HTTP/1.1 相关
- RFC7230: HTTP/1.1
- RFC7231: HTTP Semantics and Content
- RFC7232: HTTP Conditional Requests
- RFC7233: HTTP Range Requests
- RFC7234: HTTP Caching
- RFC7235: HTTP Authentication
中文翻译: duoani/HTTP-RFCs.zh-cn: 翻译 HTTP 相关的 RFC (中英文对照) (github.com)
HTTP/2 相关
- RFC7540: HTTP/2
- RFC8740: HTTP/2 with TLS 1.3
中文翻译: abbshr/rfc7540-translation-zh_cn: RFC 7540 - HTTP/2 中文翻译版 (github.com)
HTTP 协议是基于 TCP 协议实现的,在 TCP 的基础上规定了一个 Request-Response 的模式。这个模式就是客户端发送消息给服务端,服务端才能返回消息给客户端,服务端不能主动发送消息。
HTTP 协议格式
HTTP 协议大概可以划分成 Request 和 Response。
Request
Request 是客户端需要发送到服务端的数据,可以分成下面这三部分:
- Request-Line(请求行)
- method(方法)
- URL
- version(版本)
- request-header(头)
- message-body(实体)
具体的数据格式:
GET /hello.txt HTTP/1.1
User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
Host: www.example.com
Accept-Language: en, mi

sp 是空格,cr 是 \r , lf 是 \n
Response
Response 是服务端返回给客户端的数据,对应的也可以分成三部分:
Response Line(响应行)
version(版本)
status code(状态码)
status text(状态文本)
Response Header(响应头)
message-body(实体)
HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: “34aa387-d-1568eb00”
Accept-Ranges: bytes
Content-Length: 51
Vary: Accept-Encoding
Content-Type: text/plain
Hello World! My payload includes a trailing CRLF.

响应状态码
- 1xx (Informational):请求已被接收,目前正在持续处理该请求
- 2xx (Successful):请求已被成功接收、理解以及接受
- 3xx (Redirection):为完成请求,需要采取进一步的动作
- 4xx (Client Error):请求包含有不良的语法,或者请求不能被实现
- 5xx (Server Error):服务器未能实现一个显然有效的请求
HTTP 2
HTTP2 是 HTTP1.1 的升级版,HTTP2 相对于 HTTP1.1 来说主要有下面几点的改进:
- 对 HTTP 的头进行压缩,对于相同的头只需要发送索引表中的索引。解决了 HTTP1.1 每次都要将 header 来回传送。
- 支持服务端推送。能够在客户端发送第一个请求时,提前把一部分内容推送给客户端。这可以避免客户端请求顺序带来的并行度不高,从而导致的问题。
- 支持 TCP 的连接复用。使用同一个 TCP 连接来传输多个 HTTP 请求,避免了 TCP 连接时的三次握手开销,和初建 TCP 连接时传输窗口小的问题。